﻿using System;
using System.Windows.Forms;
using UniMana.Utils.Data;
using UniMana.Data;
using System.Data;
using DevExpress.XtraEditors;
using System.Collections.Generic;
using UniMana.Utils.Configs;

namespace UniMana.Win.Leadership
{
    public partial class Frm_Leadership : DevExpress.XtraEditors.XtraForm
    {
        private DBMain m_data = new DBMain();
        private string m_strPersonnalKey = "";
        private string m_strPersonnalName = "";
        private Personnel_PersonnelInfo personnalinfo;
        DataTable m_tblTable;
        TreeNode nodeSelect;
        int m_iDepartmentKey = 0;
        List<int> l_LeadershipRelationshipKey;

        public DevExpress.Utils.WaitDialogForm dlg;

        public Frm_Leadership()
        {
            InitializeComponent();
        }

        private void Frm_Leadership_Load(object sender, EventArgs e)
        {
            GetData();
            Auto.Interval = 400;
            Auto.Enabled = true;
        }
        
        private void GetData()
        {
            lbcNameWait.Text = "";
            gluCatalogue_DepartmentLeft.GetData(m_data.m_DCReadOnly.Catalogue_Departments, "Catalogue_DepartmentKey", "Name", chooseAll: true);
            gluCatalogue_DepartmentRight.GetData(m_data.m_DCReadOnly.Catalogue_Departments, "Catalogue_DepartmentKey", "Name");
            LoadTreeLeader();
        }

        private void LoadTreeLeader()
        {
            if (trvView.GetNodeCount(true) > 0)
                trvView.Nodes.Clear();
            m_tblTable = new DataTable();
            m_tblTable = m_data.m_DCReadOnly.LeadershipRelationships.GetData().ToDataTable();
            for (int i = 0; i < m_tblTable.Rows.Count; i++)
            {
                Personnel_PersonnelInfo pinfo = new Personnel_PersonnelInfo(Guid.Parse(m_tblTable.Rows[i]["Personnel_PersonnelKey"].ToString()));
                if (int.Parse(m_tblTable.Rows[i]["ApproveLevel"].ToString()) == 0)
                    trvView.Nodes.Add(m_tblTable.Rows[i]["LeadershipRelationshipKey"].ToString(), pinfo.Properties.ID + " - " + pinfo.Properties.LastName + " " + pinfo.Properties.Name);
                else
                {
                    TreeNode nodelocal = new TreeNode();
                    nodelocal = SearchNode(m_tblTable.Rows[i]["ApproveLevel"].ToString(), trvView.Nodes[0]);
                    nodelocal.Nodes.Add(m_tblTable.Rows[i]["LeadershipRelationshipKey"].ToString(), pinfo.Properties.ID + " - " + pinfo.Properties.LastName + " " + pinfo.Properties.Name);
                }
            }
            trvView.ExpandAll();
        }

        /// <summary>
        /// Tìm kiếm thành viên trên cây phân quyền
        /// </summary>
        /// <param name="value"></param>
        /// <param name="StartNode"></param>
        /// <returns></returns>

        private TreeNode SearchNode(string value, TreeNode StartNode)
        {
            TreeNode node = null;
            while (StartNode != null)
            {
                if (StartNode.Name.ToString() == value)
                {
                    node = StartNode;
                    break;
                }
                if (StartNode.Nodes.Count != 0)
                {
                    node = SearchNode(value, StartNode.Nodes[0]);//Recursive Search
                    if (node != null)
                        break;
                }
                StartNode = StartNode.NextNode;
            }
            return node;
        }

        /// <summary>
        /// Chọn danh sách thành viên thuộc khoa chọn
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void gluCatalogue_DepartmentLeft_EditValueChanged(object sender, EventArgs e)
        {
            BindingSource m_bds = new BindingSource();
            m_bds.DataSource = m_data.m_DCReadOnly.Personnel_Personnels.GetPersonnalWithDepartmentKey(GetValueLookUpEdit.ConvertValueToInt(gluCatalogue_DepartmentLeft.EditValue));
            gctViewLeft.DataSource = m_bds;
        }

        /// <summary>
        /// Chọn vị trí để thêm thành viên vào cây phân quyền
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void trvView_AfterSelect(object sender, TreeViewEventArgs e)
        {
            nodeSelect = trvView.SelectedNode;
            // Thêm nhóm cây phân quyền
            if (m_strPersonnalKey != "")
            {
                Personnel_PersonnelInfo personinfo = new Personnel_PersonnelInfo(Guid.Parse(m_strPersonnalKey));
                // Node select
                if (nodeSelect != null)
                {
                    // Kiểm tra thành viên đã thuộc cấp phân nhóm
                    if (m_data.m_DCReadOnly.LeadershipRelationships.CheckInsert(int.Parse(nodeSelect.Name.ToString()), m_strPersonnalKey))
                    {
                        DialogResult result;
                        int countDepartment = m_data.m_DCReadOnly.Leaderships.CountDepartmentOfPersonnal(int.Parse(nodeSelect.Name.ToString()));
                        if (countDepartment > 0)
                        {
                            result = XtraMessageBox.Show("Bạn phải chuyển quyền quản lý các khoa từ " + nodeSelect.Text + " sang " + personinfo.Properties.ID + " - " + personinfo.Properties.LastName + " " + personinfo.Properties.Name,
                                "Thông báo", MessageBoxButtons.YesNo);
                        }
                        else
                            result = DialogResult.Yes;
                        if (result == DialogResult.No)
                            goto endInsert;
                        // Thêm node mới vào CSDL cho thành viên mới thêm vào
                        LeadershipRelationshipInfo relateinfo = new LeadershipRelationshipInfo();
                        relateinfo.Properties.Personnel_PersonnelKey = personnalinfo.Properties.Personnel_PersonnelKey;
                        relateinfo.Properties.ApproveLevel = int.Parse(nodeSelect.Name.ToString());
                        relateinfo.Save();

                        if (countDepartment > 0)
                        {
                            // Lấy mã số phân quyền vừa được thêm
                            int m_inewkey = m_data.m_DCReadOnly.LeadershipRelationships.ReturnLeadershipRelationshipKey(m_strPersonnalKey);
                            // Chuyển quyền quản lý khoa nếu thêm vào cuối nhánh
                            LeadershipInfo leinfo;
                            for (int i = 0; i < countDepartment; i++)
                            {
                                leinfo = new LeadershipInfo(int.Parse(nodeSelect.Name.ToString()), "");
                                leinfo.Properties.LeadershipRelationshipKey = m_inewkey;
                                leinfo.Save();
                            }
                        }
                        LoadTreeLeader();
                    endInsert:
                        string vaa = "";
                    }
                    else
                        XtraMessageBox.Show(personinfo.Properties.ID + " - " + personinfo.Properties.LastName + " " + personinfo.Properties.Name + " đã được thêm vào vị trí tương tự trên cây phân quyền!", "Thông báo");
                }
            }
            m_strPersonnalKey = "";
            m_strPersonnalName = "";
        }

        /// <summary>
        /// Chọn thành viên để đưa vào danh sách lãnh đạo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void gctViewLeft_Click(object sender, EventArgs e)
        {
            try
            {
                if ((!grvViewLeft.IsFilterRow(grvViewLeft.FocusedRowHandle)) && (!grvViewLeft.IsGroupRow(grvViewLeft.FocusedRowHandle)))
                {
                    m_strPersonnalKey = grvViewLeft.GetFocusedRowCellValue(gclPersonnel_PersonnelKey).ToString();
                    personnalinfo = new Personnel_PersonnelInfo(Guid.Parse(m_strPersonnalKey));
                    m_strPersonnalName = personnalinfo.Properties.LastName + " " + personnalinfo.Properties.Name;
                }
            }
            catch { }
        }

        /// <summary>
        /// Xóa nhánh (node) phân quyền
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void xóaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            nodeSelect = trvView.SelectedNode;
            if (nodeSelect != null)
            {
                dlg = new DevExpress.Utils.WaitDialogForm(MsgConfig.MSG_WAIT, MsgConfig.MSG_LOADING);
                // Xóa các node con
            laplai:
                DeleteNodeRecursive(int.Parse(nodeSelect.Name.ToString()));
                if (m_data.m_DCReadOnly.LeadershipRelationships.ReturnCountLeadershipRelationshipKey(int.Parse(nodeSelect.Name.ToString()), 0) > 0)
                    goto laplai;
                // Xóa node select
                DeleteNode(int.Parse(nodeSelect.Name.ToString()));
                LoadTreeLeader();
                nodeSelect = new TreeNode();

                gctViewRight.DataSource = null;
                dlg.Close();
            }
            else
                XtraMessageBox.Show("Chưa chọn thành viên để xóa", "Thông báo");
        }

        /// <summary>
        /// Xóa đệ qui
        /// </summary>
        /// <param name="value"></param>

        private void DeleteNodeRecursive(int valueRoot)
        {
            while (m_data.m_DCReadOnly.LeadershipRelationships.ReturnCountLeadershipRelationshipKey(int.Parse(nodeSelect.Name.ToString()), 0) > 0)
            {
                if (m_data.m_DCReadOnly.LeadershipRelationships.ReturnCountLeadershipRelationshipKey(valueRoot, 0) == 0)
                {
                    DeleteNode(valueRoot);
                    break;
                }
                if (m_data.m_DCReadOnly.LeadershipRelationships.ReturnCountLeadershipRelationshipKey(valueRoot, 0) > 0)
                {
                    DeleteNodeRecursive(m_data.m_DCReadOnly.LeadershipRelationships.ReturnRelationshipKeyWithApproveLevel(valueRoot));
                    if (m_data.m_DCReadOnly.LeadershipRelationships.ReturnCountLeadershipRelationshipKey(valueRoot, 0) == 0)
                    {
                        break;
                    }
                }
                valueRoot = m_data.m_DCReadOnly.LeadershipRelationships.ReturnRelationshipKeyWithApproveLevel(valueRoot);
            }
            LoadTreeLeader();
        }

        /// <summary>
        /// Xóa node
        /// </summary>
        /// <param name="value"></param>

        private void DeleteNode(int value)
        {
            LeadershipRelationshipInfo relainfo = new LeadershipRelationshipInfo(value);
            int countDepartment = m_data.m_DCReadOnly.Leaderships.CountDepartmentOfPersonnal(value);
            if (countDepartment > 0)
            {
                LeadershipInfo leainfo;
                for (int i = 0; i < countDepartment; i++)
                {
                    leainfo = new LeadershipInfo(value, "true");
                    leainfo.Delete();
                }
            }
            relainfo.Delete();
        }

        /// <summary>
        /// Thêm nhánh mới vào cây phân quyền
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void btnAdd_Click(object sender, EventArgs e)
        {            
            if (m_strPersonnalKey != "")
            {
                // Thêm node mới vào CSDL cho thành viên mới thêm vào
                LeadershipRelationshipInfo relateinfo = new LeadershipRelationshipInfo();
                relateinfo.Properties.Personnel_PersonnelKey = personnalinfo.Properties.Personnel_PersonnelKey;
                relateinfo.Properties.ApproveLevel = 0;
                relateinfo.Save();
                m_strPersonnalKey = "";
                LoadTreeLeader();
            }
        }

        /// <summary>
        /// Điều khiển chọn thành viên lãnh đạo để chỉnh sửa danh sách khoa quản lý
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void trvView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (m_strPersonnalKey == "")
            {
                if (e.Node.LastNode == null)
                {
                    btnAddDepartment.Enabled = true;
                    LoadListDepartment(int.Parse(e.Node.Name.ToString()));
                }
                else
                {
                    btnAddDepartment.Enabled = false;
                    l_LeadershipRelationshipKey = new List<int>();
                    ScanChildNodes(e.Node.Nodes);
                    DisplayListDepartment(l_LeadershipRelationshipKey);
                }
            }
        }

        /// <summary>
        /// Tìm và thêm tất cả các node con của nodeselect
        /// </summary>
        /// <param name="treeView"></param>

        private void ScanChildNodes(TreeNodeCollection nodecollection)
        {
            TreeNodeCollection nodes = nodecollection;
            foreach (TreeNode n in nodes)
                AddInList(n);
        }

        private void AddInList(TreeNode node)
        {
            l_LeadershipRelationshipKey.Add(int.Parse(node.Name.ToString()));
            foreach (TreeNode tn in node.Nodes)
                AddInList(tn);
        }

        /// <summary>
        /// Lấy và hiển thị các khoa thuộc quyền quản lý trong danh sách truyền vào
        /// </summary>
        /// <param name="l_LeadershipRelationshipKey"></param>

        private void DisplayListDepartment(List<int> l_LeadershipRelationshipKey)
        {
            DataTable m_tblListDepartment = new DataTable();
            m_tblListDepartment.Clear();
            m_tblListDepartment.Columns.Add("Catalogue_DepartmentKey");
            m_tblListDepartment.Columns.Add("Name");
            if (l_LeadershipRelationshipKey.Count > 0)
                for (int i = 0; i < l_LeadershipRelationshipKey.Count; i++)
                {
                    m_tblTable = new DataTable();
                    m_tblTable = m_data.m_DCReadOnly.Leaderships.GetListDepartmentWithLeaderRelationshipKey(m_data.m_DCReadOnly.Catalogue_Departments,
                        int.Parse(l_LeadershipRelationshipKey[i].ToString())).ToDataTable();
                    if (m_tblTable.Rows.Count > 0)
                    {
                        for (int j = 0; j < m_tblTable.Rows.Count; j++)
                            if (CheckDeparmentExit(int.Parse(m_tblTable.Rows[j]["Catalogue_DepartmentKey"].ToString()), m_tblListDepartment) == false)  // Thêm khi không trùng
                                m_tblListDepartment.Rows.Add(m_tblTable.Rows[j]["Catalogue_DepartmentKey"], m_tblTable.Rows[j]["Name"]);
                    }
                }
            if (m_tblListDepartment.Rows.Count > 0)
                gctViewRight.DataSource = m_tblListDepartment;
            else
                gctViewRight.DataSource = null;
        }

        /// <summary>
        /// Kiểm tra khoa có trùng với danh sách khoa
        /// </summary>
        /// <param name="DeparmentKey"></param>
        /// <param name="m_tblListDepartment"></param>
        /// <returns></returns>

        private bool CheckDeparmentExit(int DeparmentKey, DataTable m_tblListDepartment)
        {
            if (m_tblListDepartment.Rows.Count == 0)
                return false;
            else
            {
                for (int i = 0; i < m_tblListDepartment.Rows.Count; i++)
                    if (DeparmentKey == int.Parse(m_tblListDepartment.Rows[i][0].ToString()))
                        return true;
                return false;
            }
        }

        /// <summary>
        /// Lấy danh sách khoa thuộc quyền lãnh đạo của người chọn
        /// </summary>
        /// <param name="m_iLeaderRelationshipKey"></param>

        private void LoadListDepartment(int m_iLeaderRelationshipKey)
        {
            BindingSource m_bdsSourse = new BindingSource();
            m_bdsSourse.DataSource = m_data.m_DCReadOnly.Leaderships.GetListDepartmentWithLeaderRelationshipKey(m_data.m_DCReadOnly.Catalogue_Departments,
                m_iLeaderRelationshipKey);
            if (m_bdsSourse.Count > 0)
            {
                gctViewRight.DataSource = m_bdsSourse;
                grvViewRight.ExpandAllGroups();
            }
            else
                gctViewRight.DataSource = null;
        }

        /// <summary>
        /// Chọn khoa để thêm vào danh sách lãnh đạo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void gluCatalogue_DepartmentRight_EditValueChanged(object sender, EventArgs e)
        {
            m_iDepartmentKey = GetValueLookUpEdit.ConvertValueToInt(gluCatalogue_DepartmentRight.EditValue);
        }

        /// <summary>
        /// Thêm khoa đã chọn vào người lãnh đạo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void btnAddDepartment_Click(object sender, EventArgs e)
        {
            if ((GetValueLookUpEdit.ConvertValueToInt(nodeSelect.Name) > 0) && (m_iDepartmentKey > 0))
            {
                if (m_data.m_DCReadOnly.Leaderships.CheckValueIsExit(m_iDepartmentKey,
                    int.Parse(nodeSelect.Name.ToString())) == true)
                    XtraMessageBox.Show("Khoa " + gluCatalogue_DepartmentRight.Text + " đã thuộc quyền lãnh đạo", "Thông báo");
                else
                {
                    LeadershipInfo leadinfo = new LeadershipInfo();
                    leadinfo.Properties.Catalogue_DepartmentKey = m_iDepartmentKey;
                    leadinfo.Properties.LeadershipRelationshipKey = int.Parse(nodeSelect.Name.ToString());
                    leadinfo.Save();
                    LoadListDepartment(int.Parse(nodeSelect.Name.ToString()));
                }
            }
            else
                XtraMessageBox.Show("Chưa chọn người lãnh đạo hoặc chưa chọn khoa !", "Thông báo");
        }

        /// <summary>
        /// Xóa khoa ra khỏi quyền lãnh đạo
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void xóaToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            if ((nodeSelect != null) && (grvViewRight.RowCount > 0))
            {
                LeadershipInfo leadinfo = new LeadershipInfo(int.Parse(grvViewRight.GetFocusedRowCellValue(gclCatalogue_DepartmentKeyRight).ToString()), int.Parse(nodeSelect.Name.ToString()));
                if (leadinfo.Properties.LeadershipKey > 0)
                {
                    leadinfo.Delete();
                    LoadListDepartment(int.Parse(nodeSelect.Name.ToString()));
                }
            }
        }

        private void Auto_Tick(object sender, EventArgs e)
        {
            if (m_strPersonnalKey.ToString() != "")
            {
                if (lbcNameWait.Text == "")
                    lbcNameWait.Text = m_strPersonnalName + " đang chờ thêm";
                else
                    lbcNameWait.Text = "";
            }
            else
                lbcNameWait.Text = "";
        }

        private static void WriteBlinkingText(string text, int delay, bool visible)
        {
            if (visible)
                Console.Write(text);
            else
                //for (int i = 0; i < text.Length; i++)
                    Console.Write(" ");
            //Console.CursorLeft -= text.Length;
            System.Threading.Thread.Sleep(delay);
        }
    }
}